﻿/* ***********************************************
 * Author		:  kingthy
 * Email		:  kingthy@gmail.com
 * Description	:  Timeline
 *
 * ***********************************************/

using System;
using System.Collections.Generic;
using System.Text;
using OpenTwitter.SDK.Sina.Objects;

namespace OpenTwitter.SDK.Sina.API
{
    /// <summary>
    /// 与时间线相关的接口实现
    /// </summary>
    public class Timeline
        : APIRequest
    {
        /// <summary>
        /// 根据授权对象实例化
        /// </summary>
        /// <param name="oauth"></param>
        public Timeline(OAuth oauth)
            : base(oauth)
        { }

        #region 广播大厅时间线
        /// <summary>
        /// 采用默认API请求地址获取广播大厅时间线
        /// </summary>
        /// <param name="count">每次返回的记录数，最大值200</param>
        /// <param name="base_app">是否仅获取当前应用发布的信息。0为所有，1为仅本应用。 </param>
        /// <returns>微博数据</returns>
        public TimelineData GetPublicTimeline(int count, bool base_app)
        {
            return this.GetPublicTimeline("http://api.t.sina.com.cn/statuses/public_timeline", count, base_app);
        }
        /// <summary>
        /// 获取广播大厅时间线
        /// </summary>
        /// <param name="requestUrl">API请求地址</param>
        /// <param name="count">每次返回的记录数，最大值200</param>
        /// <param name="base_app">是否仅获取当前应用发布的信息。0为所有，1为仅本应用。 </param>
        /// <returns>微博数据</returns>
        public TimelineData GetPublicTimeline(string requestUrl, int count, bool base_app)
        {
            this.Clear();
            this.Parameters.Add("count", count);
            this.Parameters.Add("base_app", base_app ? 1 : 0);
            return this.GetResponseData<TimelineData>(requestUrl);
        }
        #endregion

        #region 主页时间线
        /// <summary>
        /// 采用默认API请求地址获取主页时间线数据
        /// </summary>
        /// <param name="since_id">如果值小于等于0则表示不指定此参数, 若指定此参数，则只返回ID比since_id大的微博消息（即比since_id发表时间晚的微博消息）。 </param>
        /// <param name="max_id">如果值小于等于0则表示不指定此参数, 若指定此参数，则返回ID小于或等于max_id的微博消息 </param>
        /// <param name="count">每次请求记录的条数（1-200条）</param>
        /// <param name="page">页码</param>
        /// <param name="base_app">是否仅获取当前应用发布的信息。0为所有，1为仅本应用。</param>
        /// <param name="feature">微博类型，0全部，1原创，2图片，3视频，4音乐. 返回指定类型的微博信息内容。 </param>
        /// <returns>获取用户收听的人+用户本人最新n条微博信息，与用户“我的主页”返回内容相同。</returns>
        public TimelineData GetHomeTimeline(long since_id, long max_id, int count, int page, bool base_app, TweetFeature feature)
        {
            return this.GetHomeTimeline("http://api.t.sina.com.cn/statuses/friends_timeline", since_id, max_id, count, page, base_app, feature);
        }
        /// <summary>
        /// 获取主页时间线数据
        /// </summary>
        /// <param name="requestUrl">API请求地址</param>
        /// <param name="since_id">如果值小于等于0则表示不指定此参数, 若指定此参数，则只返回ID比since_id大的微博消息（即比since_id发表时间晚的微博消息）。 </param>
        /// <param name="max_id">如果值小于等于0则表示不指定此参数, 若指定此参数，则返回ID小于或等于max_id的微博消息 </param>
        /// <param name="count">每次请求记录的条数（1-200条）</param>
        /// <param name="page">页码</param>
        /// <param name="base_app">是否仅获取当前应用发布的信息。0为所有，1为仅本应用。</param>
        /// <param name="feature">微博类型，0全部，1原创，2图片，3视频，4音乐. 返回指定类型的微博信息内容。 </param>
        /// <returns>获取用户收听的人+用户本人最新n条微博信息，与用户“我的主页”返回内容相同。</returns>
        public TimelineData GetHomeTimeline(string requestUrl, long since_id, long max_id, int count, int page, bool base_app, TweetFeature feature)
        {
            this.Clear();
            if (since_id > 0) this.Parameters.Add("since_id", since_id);
            if (since_id > 0) this.Parameters.Add("max_id", max_id);
            this.Parameters.Add("count", count);
            this.Parameters.Add("page", page);
            this.Parameters.Add("base_app", base_app ? 1 : 0);
            this.Parameters.Add("feature", (int)feature);
            return this.GetResponseData<TimelineData>(requestUrl);
        }
        #endregion

        #region 用户提及时间线
        /// <summary>
        /// 采用默认API请求地址获取用户提及时间线
        /// </summary>
        /// <param name="since_id">如果值小于等于0则表示不指定此参数, 若指定此参数，则只返回ID比since_id大的微博消息（即比since_id发表时间晚的微博消息）。 </param>
        /// <param name="max_id">如果值小于等于0则表示不指定此参数, 若指定此参数，则返回ID小于或等于max_id的微博消息 </param>
        /// <param name="count">每次请求记录的条数（1-200条）</param>
        /// <param name="page">页码</param>
        /// <returns>获取最新n条@提到我的微博。</returns>
        public TimelineData GetMentionsTimeline(long since_id, long max_id, int count, int page)
        {
            return this.GetMentionsTimeline("http://api.t.sina.com.cn/statuses/mentions", since_id, max_id, count, page);
        }
        /// <summary>
        /// 获取获取用户提及时间线
        /// </summary>
        /// <param name="requestUrl">API请求地址</param>
        /// <param name="since_id">如果值小于等于0则表示不指定此参数, 若指定此参数，则只返回ID比since_id大的微博消息（即比since_id发表时间晚的微博消息）。 </param>
        /// <param name="max_id">如果值小于等于0则表示不指定此参数, 若指定此参数，则返回ID小于或等于max_id的微博消息 </param>
        /// <param name="count">每次请求记录的条数（1-200条）</param>
        /// <param name="page">页码</param>
        /// <returns>获取最新n条@提到我的微博。</returns>
        public TimelineData GetMentionsTimeline(string requestUrl, long since_id, long max_id, int count, int page)
        {
            this.Clear();
            if (since_id > 0) this.Parameters.Add("since_id", since_id);
            if (since_id > 0) this.Parameters.Add("max_id", max_id);
            this.Parameters.Add("count", count);
            this.Parameters.Add("page", page);
            return this.GetResponseData<TimelineData>(requestUrl);
        }
        #endregion
    }
}
